package com.sixdog.regulate.windows;

import com.sixdog.regulate.constant.JFrameItem;
import com.sixdog.regulate.ctl.JFrameCtl;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.swing.*;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
import java.awt.*;
import java.awt.event.*;

/**
 * 主界面
 */
@Component
@SuppressWarnings("all")
public class RegulateMain extends JFrame implements InitializingBean {

    @Autowired
    private RegulateMain main;

    // 注入控制层，管理各种组件
    @Autowired
    private JFrameCtl ctl;

    // 主窗口是否关闭标记
    private boolean isClosed;

    public RegulateMain(){}

    public boolean isClosed() {
        return isClosed;
    }

    public void setClosed(boolean closed) {
        isClosed = closed;
    }

    public void init(){
        // 设置标题
        setTitle("Regulate控制面板");
        // 设置是否可见
        setVisible(true);
        // 设置宽高
        setSize(700,600);
        // 设置默认的关闭操作
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        // 设置点击关闭按钮后的回调函数
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosed(WindowEvent e) {
                // 设置关闭标记
                setClosed(true);
            }
        });
        // 创建菜单栏 并添加到 控制层的集合中
        JMenuBar regulateMainMenuBar = new JMenuBar();
        ctl.getMenuBar().put(JFrameItem.JFrameItemName.MAIN_MENU_BAR.getName(),regulateMainMenuBar);

        // 将菜单栏添加到窗口中
        setJMenuBar(regulateMainMenuBar);
        initDefaultMenu();
        initLayout();
    }

    // 为菜单栏初始化默认菜单信息
    private void initDefaultMenu(){
        // 从控制器的管理集合中获取菜单栏
        JMenuBar menuBar = ctl.getMenuBar().get(JFrameItem.JFrameItemName.MAIN_MENU_BAR.getName());
        // 添加【文件】菜单
        JMenu fileMenu = new JMenu("文件(F)");
        // 为文件菜单设置快捷键 Alt + F
        fileMenu.setMnemonic('F');
        // 添加【文件】菜单到菜单栏
        menuBar.add(fileMenu);

        // 添加【关于】菜单
        JMenu aboutMenu = new JMenu("关于");
        menuBar.add(aboutMenu);
        // 为【关于】菜单添加监听
        aboutMenu.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {

                JOptionPane.showMessageDialog(main, "仅供娱乐,请勿外传!","关于", JOptionPane.INFORMATION_MESSAGE);
            }

            @Override
            public void mousePressed(MouseEvent e) {

            }

            @Override
            public void mouseReleased(MouseEvent e) {

            }

            @Override
            public void mouseEntered(MouseEvent e) {

            }

            @Override
            public void mouseExited(MouseEvent e) {

            }
        });
        aboutMenu.addMenuListener(new MenuListener() {
            @Override
            public void menuSelected(MenuEvent e) {
                // 菜单被选择后执行该函数
                //JOptionPane.showMessageDialog(main, "仅供娱乐,请勿外传!","关于", JOptionPane.INFORMATION_MESSAGE);
            }

            // 不使用该函数，所以默认空实现
            @Override
            public void menuDeselected(MenuEvent e) {

            }

            // 不使用该函数，所以默认空实现
            @Override
            public void menuCanceled(MenuEvent e) {

            }
        });


        // 将关于菜单 和 文件菜单 添加到 Ctl集合中
        ctl.getMenus().put(JFrameItem.JFrameItemName.ABOUT_MENU.getName(),aboutMenu);
        ctl.getMenus().put(JFrameItem.JFrameItemName.FILE_MENU.getName(),fileMenu);
    }

    // 初始化布局
    private void initLayout(){
        // 顶部的Panel面板
        JPanel headPanel = new JPanel();
        JLabel headLabel = new JLabel("左侧显示已经连接的设备信息(10秒刷新一次设备信息),右侧显示当前设备的详细信息");
        headPanel.setBackground(Color.WHITE);
        headPanel.add(headLabel);

        // 左侧的Panel面板
        JPanel leftPanel = new JPanel();
        leftPanel.setPreferredSize(new Dimension(200,0));
        JLabel leftLabel = new JLabel("左侧的Panel");
        leftPanel.setBackground(Color.WHITE);
        leftPanel.setLayout(null);
        //leftPanel.add(leftLabel,BorderLayout.NORTH);
        //leftLabel.setBounds(100,60,85,35);
        // 右侧的Panel面板
        JPanel rightPanel = new JPanel();
        JLabel rightLabel = new JLabel("请选择一个设备序列号");
        rightPanel.setBackground(Color.WHITE);
        rightPanel.add(rightLabel);
        // 底部的Panel面板
        JPanel bottomPanel = new JPanel();
        JLabel bottomLabel = new JLabel("底部的Panel");
        bottomPanel.setBackground(Color.GREEN);
        bottomPanel.add(bottomLabel);
        add(headPanel, BorderLayout.NORTH);
        add(leftPanel, BorderLayout.WEST);
        add(bottomPanel, BorderLayout.SOUTH);
        add(rightPanel, BorderLayout.CENTER);

        headPanel.updateUI();
        leftPanel.updateUI();
        rightPanel.updateUI();
        bottomPanel.updateUI();
        System.out.println("-----------------------------");


        // 将Panel面板添加到控制器集合中
        ctl.getPanels().put(JFrameItem.JFrameItemName.HEAD_PANEL.getName(),headPanel);
        ctl.getPanels().put(JFrameItem.JFrameItemName.LEFT_PANEL.getName(),leftPanel);
        ctl.getPanels().put(JFrameItem.JFrameItemName.RIGHT_PANEL.getName(),rightPanel);
        ctl.getPanels().put(JFrameItem.JFrameItemName.BOTTOM_PANEL.getName(),bottomPanel);

        // 将Label面板添加到控制器集合中
        ctl.getLabels().put(JFrameItem.JFrameItemName.HEAD_LABEL.getName(),headLabel);
        ctl.getLabels().put(JFrameItem.JFrameItemName.LEFT_LABEL.getName(),leftLabel);
        ctl.getLabels().put(JFrameItem.JFrameItemName.RIGHT_LABEL.getName(),rightLabel);
        ctl.getLabels().put(JFrameItem.JFrameItemName.BOTTOM_LABEL.getName(),bottomLabel);

        JList<String> serialNoList = (JList<String>) ctl.getOthers().get(JFrameItem.JFrameItemName.SERIAL_NO_LIST.getName());
        String[] data = new String[5];
        // 将数据列表添加到左侧Panel中
        for(int i = 0 ; i < data.length ; i++){
            data[i] = new StringBuilder().append("这是第").append(i).append("个模拟数据").toString();
        }
        //serialNoList.setListData(data);
        ctl.getPanels().get(JFrameItem.JFrameItemName.LEFT_PANEL.getName())
                .add((JScrollPane) ctl.getOthers().get(JFrameItem.JFrameItemName.DEVICE_LIST_PANE.getName()),BorderLayout.CENTER);

    }

    @Override
    public void afterPropertiesSet() throws Exception {
        ctl.addListenerForJList();
    }
}
